import { ref } from 'vue';

/**
 * 缓存选项接口
 */
export interface CacheOptions {
  prefix?: string;
  expire?: number;
}

/**
 * 缓存数据接口
 */
export interface CacheData<T> {
  data: T;
  expire: number;
}

/**
 * 缓存钩子函数
 * @param key 缓存键
 * @param defaultValue 默认值
 * @param options 缓存选项
 */
export default function useCache<T>(
  key: string,
  defaultValue?: T,
  options: CacheOptions = {}
) {
  // 缓存键
  const cacheKey = options.prefix ? `${options.prefix}:${key}` : key;
  
  // 缓存数据
  const data = ref<T | undefined>(defaultValue);
  
  // 是否已加载
  const loaded = ref(false);
  
  // 获取缓存数据
  const get = (): T | undefined => {
    if (loaded.value) {
      return data.value;
    }
    
    try {
      const cacheData = uni.getStorageSync(cacheKey);
      
      if (cacheData) {
        const cache = typeof cacheData === 'string' ? JSON.parse(cacheData) : cacheData;
        
        // 如果缓存未过期
        if (!cache.expire || cache.expire > Date.now()) {
          data.value = cache.data;
          loaded.value = true;
          return data.value;
        }
      }
    } catch (err) {
      console.error('获取缓存数据失败', err);
    }
    
    data.value = defaultValue;
    loaded.value = true;
    return data.value;
  };
  
  // 设置缓存数据
  const set = (value: T, expire?: number): void => {
    data.value = value;
    loaded.value = true;
    
    try {
      const cacheData: CacheData<T> = {
        data: value,
        expire: expire ? Date.now() + expire : (options.expire ? Date.now() + options.expire : 0)
      };
      
      uni.setStorageSync(cacheKey, JSON.stringify(cacheData));
    } catch (err) {
      console.error('设置缓存数据失败', err);
    }
  };
  
  // 移除缓存数据
  const remove = (): void => {
    data.value = undefined;
    loaded.value = false;
    
    try {
      uni.removeStorageSync(cacheKey);
    } catch (err) {
      console.error('移除缓存数据失败', err);
    }
  };
  
  // 初始化获取缓存数据
  get();
  
  return {
    data,
    loaded,
    get,
    set,
    remove
  };
} 